package com.tensai.teach.beijing.utils.files;

import com.alibaba.fastjson.JSON;
import com.tensai.teach.beijing.BmapPoint;
import com.tensai.teach.beijing.model.old.base.MapData;
import com.tensai.teach.beijing.model.old.base.second.Features;
import com.tensai.teach.beijing.model.old.base.second.features.geometry.OtherGeo;
import com.tensai.teach.beijing.model.old.base.second.features.properties.RoadProperties;
import com.tensai.teach.beijing.utils.EntityServiceUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Tensai
 */
@Slf4j
public class RoadService {

	private static final List<Long> LIST_N = new ArrayList<Long>() {{
		add(1871624L);
		add(1873687L);
		add(1873688L);
		add(1873684L);
		add(1871554L);
		add(1871619L);
		add(1871673L);
	}};
	private static final List<Long> LIST_S = new ArrayList<Long>() {{
		add(1871614L);
		add(1871594L);
		add(1872048L);
		add(1872038L);
		add(1872028L);
		add(1872018L);
		add(1872008L);
		add(1871998L);
		add(1871988L);
		add(1871978L);
		add(1871968L);
		add(1871958L);
		add(1871948L);
	}};
	private static final List<Long> LIST_W = new ArrayList<Long>() {{
		add(1871562L);
		add(1871693L);
		add(1871555L);
		add(1871631L);
		add(1871716L);
		add(1871590L);
		add(1871659L);
	}};
	private static final List<Long> LIST_E = new ArrayList<Long>() {{
		add(1870645L);
		add(1870649L);
		add(1870655L);
		add(1870646L);
		add(1870648L);
		add(1870647L);
		add(1870651L);
		add(1870652L);
		add(1870650L);
		add(1871618L);
		add(1871878L);
		add(1871888L);
		add(1871898L);
	}};


	public List<BmapPoint> getRoadList(List<Long> idList) {
		MapData<RoadProperties, OtherGeo> road = EntityServiceUtil.getRoad();
		List<BmapPoint> list = new ArrayList<>();
		idList.forEach(id -> {
			List<BmapPoint> tmpList = road.getFeatures().stream()
					.filter(it -> id.equals(it.getProperties().getRoadId()))
					.findAny()
					.map(Features::getGeometry)
					.map(OtherGeo::makeBmapPointList)
					.orElse(new ArrayList<>());
			list.addAll(tmpList);
		});
		return list;
	}

	public RoadProperties getProperties(Long id) {
		MapData<RoadProperties, OtherGeo> road = EntityServiceUtil.getRoad();
		return road.getFeatures().stream()
				.filter(it -> id.equals(it.getProperties().getRoadId()))
				.findAny()
				.map(Features::getProperties)
				.orElse(new RoadProperties());

	}

	public Double getLength(Long id) {
		return getProperties(id).getLength();
	}

	public Integer getSpeedLimit(Long id) {
		return getProperties(id).getMaxSpeed();
	}


	@Test
	public void test() {
		log.info("S");
		log.info(JSON.toJSONString(getRoadList(LIST_S)));
		log.info("N");
		log.info(JSON.toJSONString(getRoadList(LIST_N)));
		log.info("W");
		log.info(JSON.toJSONString(getRoadList(LIST_W)));
		log.info("E");
		log.info(JSON.toJSONString(getRoadList(LIST_E)));
	}
}
